CS Academy - Farey Sequence 題解

作法

考慮小數點二分搜,我們去二分搜到剛好有 k 個比 x 小(最小的 x 滿足 x 的分數恰為 k

至於如何檢查,對於一個固定的分母 j,有多少個分子 i 會小於 x 呢 ?

ijxix×j

答案是 1jx×jj,也就是 x×j 個,但如果枚舉分母,都這樣會算的話會算到重複的,例如 24 會在分母為 24 各被算過一次,很明顯就是因數的問題,所以我們列出

dp[j]=x×jcjdp[c]

具體實作類似篩法,如下

最後,要輸出分數答案時,找比 x 小裡面最大是那個分數。這可以枚舉分母 j,以 j 為分母第一個小於等於 x 的分子就是 x×j,對於每個分母算出來的取 i/j 最大的即可


另法

另一種想法也類似,我們觀察到,Farey 序列裡面相鄰兩項的差大於 1n×n1,所以我們可以 1n×n 為一單位將序列隔開。

所以我們可以去二分搜 x 滿足小於等於 xn×n 的分數恰為 k 個,檢查的話一樣推倒

ijxn×nixn×n×j

也一樣用類篩法實作,最後要輸出答案時,找 ij 滿足 ij 恰好在 x1n×nxn×n 之間。實作上一樣枚舉分母 j,看以分母為 j,第一個小於等於 xn×niji=xn×n×j)是否介於 x1n×nxn×n 之間。

 


1 根據 Farey 序列的性質,相鄰兩項 q1p1,q2p2 的差 =1p1×p2,證明見 Wiki